Õpi, kuidas rakendada Reacti veapiire hookide abil, et sujuvalt hallata ressursside laadimise vigu, parandades kasutajakogemust ja rakenduse stabiilsust.
Tugev Ressursside Laadimine Reactis: Veapiiride (Error Boundaries) Valdamine Hookide Abil
Tänapäevastes veebirakendustes on ressursside asünkroonne laadimine tavapärane praktika. Olgu tegemist andmete toomisega API-st, piltide laadimisega või moodulite importimisega, on potentsiaalsete vigade käsitlemine ressursside laadimisel sujuva kasutajakogemuse jaoks ülioluline. Reacti veapiirid (Error Boundaries) pakuvad mehhanismi JavaScripti vigade püüdmiseks mis tahes kohas nende alamkomponentide puus, nende vigade logimiseks ja varu-kasutajaliidese kuvamiseks kogu rakenduse kokkujooksmise asemel. See artikkel uurib, kuidas veapiire koos React Hookidega tõhusalt kasutada ressursside laadimise vigade haldamiseks.
Veapiiride Mõistmine
Enne React 16 versiooni rikkusid käsitsemata JavaScripti vead komponendi renderdamise ajal Reacti sisemise oleku ja põhjustasid järgnevatel renderdamistel krüptilisi vigu. Veapiirid lahendavad selle probleemi, toimides püüdmisplokkidena vigade jaoks, mis tekivad nende alamkomponentides. Need on Reacti komponendid, mis rakendavad ühte või mõlemat järgmistest elutsükli meetoditest:
static getDerivedStateFromError(error): See staatiline meetod kutsutakse välja pärast seda, kui alamkomponent on vea visanud. See saab argumendina visatud vea ja tagastab väärtuse komponendi oleku uuendamiseks.componentDidCatch(error, info): See elutsükli meetod kutsutakse välja pärast seda, kui alamkomponent on vea visanud. See saab argumendina visatud vea, samuti objekti, mis sisaldab teavet selle kohta, milline komponent vea viskas. Saate seda kasutada veateabe logimiseks.
Oluline on märkida, et veapiirid püüavad vigu ainult renderdamise faasis, elutsükli meetodites ja kogu nende all oleva puu konstruktorites. Nad ei püüa vigu:
- Sündmuste käsitlejad (rohkem infot allpool olevas jaotises)
- AsĂĽnkroonne kood (nt
setTimeoutvõirequestAnimationFrametagasikutsefunktsioonid) - Serveripoolne renderdamine
- Veapiiris endas (mitte selle lastes) visatud vead
Veapiirid ja React Hookid: Võimas Kombinatsioon
Kuigi veapiiride rakendamiseks kasutati traditsiooniliselt klassikomponente, pakuvad React Hookid lühemat ja funktsionaalsemat lähenemist. Saame luua korduvkasutatava useErrorBoundary hooki, mis kapseldab veahalduse loogika ja pakub mugavat viisi komponentide mähkimiseks, mis võivad ressursside laadimisel vigu visata.
Kohandatud useErrorBoundary Hooki Loomine
Siin on näide useErrorBoundary hookist:
import { useState, useCallback } from 'react';
function useErrorBoundary() {
const [error, setError] = useState(null);
const resetError = useCallback(() => {
setError(null);
}, []);
const captureError = useCallback((e) => {
setError(e);
}, []);
const ErrorBoundary = useCallback(({ children, fallback }) => {
if (error) {
return fallback ? fallback : An error occurred: {error.message || String(error)};
}
return children;
}, [error]);
return { ErrorBoundary, captureError, error, resetError };
}
export default useErrorBoundary;
Selgitus:
useState: KasutameuseState'i vea oleku haldamiseks. See seab vea esialgu väärtuselenull.useCallback: KasutameuseCallback'i, et memoiseerida funktsiooneresetErrorjacaptureError. See on hea praktika, et vältida tarbetuid uuesti renderdamisi, kui neid funktsioone edastatakse prop'idena.ErrorBoundaryKomponent: See on funktsionaalne komponent, mis on looduduseCallback'iga ja võtab vastuchildrenja valikulisefallbackprop'i. Kui olekus on viga, renderdab see kas etteantudfallbackkomponendi või vaikeveateate. Vastasel juhul renderdab see lapsi. See toimib meie veapiirina. Sõltuvuste massiiv `[error]` tagab, et see renderdatakse uuesti, kui `error` olek muutub.captureErrorFunktsioon: Seda funktsiooni kasutatakse vea oleku seadmiseks. Te kutsute sedatry...catchplokis ressursside laadimisel.resetErrorFunktsioon: See funktsioon tühjendab vea oleku, võimaldades komponendil oma lapsi uuesti renderdada (potentsiaalselt uuesti proovides ressurssi laadida).
Ressursside Laadimise Rakendamine Veahaldusega
Nüüd vaatame, kuidas seda hooki kasutada ressursside laadimise vigade käsitlemiseks. Vaatleme komponenti, mis toob API-st kasutajaandmeid:
import React, { useState, useEffect } from 'react';
import useErrorBoundary from './useErrorBoundary';
function UserProfile({ userId }) {
const [user, setUser] = useState(null);
const { ErrorBoundary, captureError, error, resetError } = useErrorBoundary();
useEffect(() => {
const fetchData = async () => {
try {
const response = await fetch(`https://api.example.com/users/${userId}`);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
setUser(data);
} catch (e) {
captureError(e);
}
};
fetchData();
}, [userId, captureError]);
if (error) {
return (
Failed to load user data. {user.name}
Email: {user.email}
{/* Other user details */}Selgitus:
- Me impordime
useErrorBoundaryhooki. - Me kutsume hooki, et saada
ErrorBoundarykomponent,captureErrorfunktsioon,errorolek jaresetErrorfunktsioon. useEffecthooki sees mähime API-kutsetry...catchplokki.- Kui API-kutse ajal tekib viga, kutsume vea oleku seadmiseks
captureError(e). - Kui
errorolek on seatud, renderdameErrorBoundarykomponendi. Pakume kohandatudfallbackprop'i, mis kuvab veateate ja "Proovi uuesti" nupu. Nupul klõpsamine kutsub esileresetError'i vea oleku tühistamiseks, käivitades uuesti renderdamise ja uue katse andmete toomiseks. - Kui viga ei tekkinud ja kasutaja andmed on laaditud, renderdame kasutajaprofiili üksikasjad.
Erinevat Tüüpi Ressursside Laadimise Vigade Käsitlemine
Erinevat tüüpi ressursside laadimise vead võivad nõuda erinevaid käsitlemisstrateegiaid. Siin on mõned levinud stsenaariumid ja kuidas nendega toime tulla:
Võrguvead
Võrguvead tekivad siis, kui klient ei suuda serveriga ühendust luua (nt võrgukatkestuse või serveri seisaku tõttu). Ülaltoodud näide käsitleb juba põhilisi võrguvigu, kasutades `response.ok`. Võiksite lisada keerukama veatuvastuse, näiteks:
// fetchData funktsiooni sees
try {
const response = await fetch(`https://api.example.com/users/${userId}`);
if (!response.ok) {
// Kaaluge spetsiifilist veakoodide käsitlemist
if (response.status === 404) {
throw new Error("User not found");
} else if (response.status >= 500) {
throw new Error("Server error. Please try again later.");
} else {
throw new Error(`HTTP error! status: ${response.status}`);
}
}
const data = await response.json();
setUser(data);
} catch (error) {
if (error.message === 'Failed to fetch') {
// Tõenäoliselt võrguviga
captureError(new Error('Network error. Please check your internet connection.'));
} else {
captureError(error);
}
}
Sellisel juhul saate kuvada kasutajale teate, mis näitab, et esineb võrguühenduse probleem, ja soovitada tal oma internetiühendust kontrollida.
API Vead
API vead tekivad siis, kui server tagastab veavastuse (nt 400 Bad Request või 500 Internal Server Error). Nagu ülal näidatud, saate kontrollida `response.status` ja neid vigu vastavalt käsitleda.
Andmete Parsimise Vead
Andmete parsimise vead tekivad siis, kui serverist saadav vastus ei ole oodatud vormingus ja seda ei saa pärssida (nt vigane JSON). Saate neid vigu käsitleda, mähkides response.json() kutse try...catch plokki:
// fetchData funktsiooni sees
try {
const response = await fetch(`https://api.example.com/users/${userId}`);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
setUser(data);
} catch (error) {
if (error instanceof SyntaxError) {
captureError(new Error('Failed to parse data from server.'));
} else {
captureError(error);
}
}
Pildi Laadimise Vead
Pildi laadimiseks saate kasutada <img> sildi onError sündmusekäsitlejat:
function MyImage({ src, alt }) {
const { ErrorBoundary, captureError } = useErrorBoundary();
const [imageLoaded, setImageLoaded] = useState(false);
const handleImageLoad = () => {
setImageLoaded(true);
};
const handleImageError = (e) => {
captureError(new Error(`Failed to load image: ${src}`));
};
return (
Failed to load image.